package top.wyloop.intoeins.module.iam.service;

import org.springframework.data.domain.Page;
import top.wyloop.intoeins.module.iam.model.entity.User;

import java.util.Date;
import java.util.List;

/**
 * @author Wyatt6
 * @date 2025/1/23
 */
public interface UserService {
    boolean checkUsernameFormat(String username);

    boolean checkPasswordFormat(String password);

    /**
     * 创建新用户
     *
     * @param username 用户名
     * @param password 密码
     */
    User createUser(String username, String password);

    /**
     * 身份验证
     * 若验证成功则返回用户对象
     *
     * @param username 用户名
     * @param password 密码（明文）
     * @return 用户对象
     */
    User authentication(String username, String password);

    /**
     * 更新用户最近登录时间
     *
     * @param id 用户ID
     * @return 用户对象
     */
    User updateLastLoginTime(Long id);

    /**
     * 条件查询用户分页
     *
     * @param pageNum         页码
     * @param pageSize        页大小
     * @param username        用户名
     * @param activated       生效状态
     * @param stCreateTime    创建时间左边界（含）
     * @param edCreateTime    创建时间右边界（含）
     * @param role            用户所绑定的角色
     * @param stLastLoginTime 最近登陆时间左边界（含）
     * @param edLastLoginTime 最近登陆时间右边界（含）
     * @return 用户分页
     */
    Page<User> getUsersByPageDataMaskConditionally(
            int pageNum,
            int pageSize,
            String username,
            Boolean activated,
            Date stCreateTime,
            Date edCreateTime,
            String role,
            Date stLastLoginTime,
            Date edLastLoginTime);

    /**
     * 修改密码
     *
     * @param id          用户ID
     * @param newPassword 新密码
     */
    void changePassword(Long id, String newPassword);

    /**
     * 设置activated值
     *
     * @param userId    用户ID
     * @param activated 要设置的值
     */
    void setActivated(Long userId, Boolean activated);

    /**
     * 绑定（绑定userId和roleIds）
     *
     * @param userId  用户ID
     * @param roleIds 该用户要绑定的角色ID
     * @return 绑定失败的角色ID列表
     */
    List<Long> bind(Long userId, List<Long> roleIds);

    /**
     * 解除绑定（取消绑定userId和roleIds）
     *
     * @param userId  用户ID
     * @param roleIds 该用户要解除绑定的角色ID列表
     * @return 解除绑定失败的角色ID列表
     */
    List<Long> cancelBind(Long userId, List<Long> roleIds);
}
